package cn.vehicle.exception;

import cn.vehicle.enums.StatusCode;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 自定义业务异常类
 * <p>
 * 用于封装系统中各种业务异常场景，统一管理异常状态码与提示信息。
 * 继承自 {@link RuntimeException}，可在运行时抛出，无需显式捕获。
 * </p>
 *
 * <p>主要功能：</p>
 * <ul>
 *   <li>通过 {@link StatusCode} 枚举快速创建标准化异常对象；</li>
 *   <li>支持自定义异常消息；</li>
 *   <li>定义常用的静态异常实例（如参数错误、系统错误、数据不存在等）。</li>
 * </ul>
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class VehicleAccessException extends RuntimeException {

    /**
     * 异常状态码，对应 {@link StatusCode#getCode()}。
     */
    private String defineCode;

    /**
     * 异常提示信息，对应 {@link StatusCode#getMessage()}。
     */
    private String message;

    // ===========================
    // 定义系统常用业务异常常量
    // ===========================

    // 常用业务异常实例定义：通过预定义状态码快速创建异常对象
    public static final VehicleAccessException DATE_EXIST = new VehicleAccessException(StatusCode.DATE_EXIST);
    public static final VehicleAccessException SYSTEM_ERROR = new VehicleAccessException(StatusCode.SYSTEM_ERROR);
    public static final VehicleAccessException PARAMS_ERROR = new VehicleAccessException(StatusCode.PARAMS_ERROR);
    public static final VehicleAccessException DATE_NOT_EXIST = new VehicleAccessException(StatusCode.DATE_NOT_EXIST);
    public static final VehicleAccessException PASSWORD_ERROR = new VehicleAccessException(StatusCode.PASSWORD_ERROR);
    public static final VehicleAccessException DELETE_ERROR = new VehicleAccessException(StatusCode.DELETE_ERROR);
    public static final VehicleAccessException LOGIN_ERROR = new VehicleAccessException(StatusCode.LOGIN_ERROR);
    public static final VehicleAccessException NET_ERROR = new VehicleAccessException(StatusCode.NET_ERROR);
    public static final VehicleAccessException IMPL_NOT_EXIST = new VehicleAccessException(StatusCode.IMPL_NOT_EXIST);
    public static final VehicleAccessException LEDGER_ERROR = new VehicleAccessException(StatusCode.LEDGER_ERROR);

    /**
     * 通过 {@link StatusCode} 枚举创建异常实例。
     *
     * @param statusCode 系统预定义的状态码枚举
     */
    public VehicleAccessException(StatusCode statusCode) {
        // 从状态枚举中提取错误码与提示信息
        this.defineCode = statusCode.getCode();
        this.message = statusCode.getMessage();
    }

    /**
     * 自定义异常构造方法
     *
     * @param defineCode 自定义错误码
     * @param message 自定义错误信息
     */
    public VehicleAccessException(String defineCode, String message) {
        this.defineCode = defineCode;
        this.message = message;
    }

    /**
     * 根据当前异常模板创建新的异常实例
     *
     * <p>允许动态替换提示信息，用于相同类型异常但不同场景的提示。</p>
     *
     * @param message 新的提示信息
     * @return 新的异常实例
     */
    public VehicleAccessException newInstance(String message) {
        return new VehicleAccessException(defineCode, message);
    }



}
